/**
 * 数学工具类 - L5
 * @author lonphy
 * @version 0.1
 */
(function(L5) {
	"use strict";

	function initConstructor() {
		L5.Math = {};
	}
	function initMethods() {
		// 常量定义
		L5.define(L5.Math, {
			PI	: Math.PI,		// PI
			PI2	: Math.PI*2,	// 2PI
			PI_HALF: Math.PI/2,	// piover2
			PI_OVER: 1/Math.PI,	// 1overpi
			PI2_OVER: 1/(Math.PI*2) // 1over2pi
		});
		/**
		 * 将角度限制在-PI 到 PI之间
		 * @param theta {Number} 弧度
		 * @return {Number} 弧度
		 */
		L5.Math.wrapPI = function(theta) {
			theta += L5.Math.PI;
			theta -= Math.floor(theta * L5.Math.PI2_OVER) * L5.Math.PI2;
			theta -= L5.Math.PI;
			return theta;
		};
		/**
		 * 安全版 - acos
		 * @param val {Number} cos值
		 * @return {Number} 返回值在0-PI之间
		 */
		L5.Math.safeAcos = function(val) {
			if (val < -1) {
				return L5.Math.PI;
			}
			if (val > 1) {
				return 0;
			}
			return Math.acos(val);
		};
		/**
		 * 对向量应用矩阵变换
		 * @param vec {L5.Vec3}
		 * @param mat {FloatArray32}
		 * @returns {L5.Vec3}
		 * @constructor
		 */
		L5.Math.Vec3xMat = function(vec, mat) {
			let w;
			let t = new L5.Vec3(),
				ret = new L5.Vec3();
			t.x = mat[ 3];
			t.y = mat[ 7];
			t.z = mat[11];
			w    =  vec.clone().dot(t) + mat[15];

			t.x = mat[ 0];
			t.y = mat[ 4];
			t.z = mat[ 8];
			ret.x = (vec.clone().dot(t)+ m[12])/w;

			t.x = mat[ 1];
			t.y = mat[ 5];
			t.z = mat[ 9];
			ret.y = (vec.clone().dot(t)+ m[13])/w;

			t.x = mat[ 2];
			t.y = mat[ 6];
			t.z = mat[ 10];
			ret.y = (vec.clone().dot(t)+ m[14])/w;

			return ret;
		};

	}
	initConstructor();
	initMethods();
})(window.L5);
